package aplicacion;

import java.util.HashMap;
import java.util.Map;

import org.apache.wicket.Page;
import org.apache.wicket.Session;
import org.apache.wicket.markup.html.pages.InternalErrorPage;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Response;
import org.apache.wicket.request.mapper.CryptoMapper;
import org.apache.wicket.settings.IExceptionSettings;
import org.apache.wicket.util.crypt.KeyInSessionSunJceCryptFactory;

import web.audio.AudioHome;
import web.autocomplete.AutocompleteHome;
import web.css.CssHome;
import web.encriptacion.EncriptacionHome;
import web.errorPage.AccesoNegado;
import web.errorPage.PageExpired;
import web.feedbackpanel.FeedbackHome;
import web.i18n.InternacionalizacionHome;
import web.jerarquia.JerarquiaHome;
import web.jquery.JQueryHome;
import web.listChoice.ListChoiceHome;
import web.modalWindow.ModalWindowHome;
import web.replaceContent.ReplaceContentHome;
import web.tablas.TablaHome;
import web.wicketLife.WicketLifeHome;

public class Aplicacion extends WebApplication{
	/**
	 * Las páginas que tiene esta aplicación de ejemplos.
	 * Agregar acá cada página que se cree.
	 * Los cambios se impactarán en el mountpage y en los links del index. 
	 */
	private static Map<String, Class<? extends Page>> paginas;
	static {
		paginas = new HashMap<String, Class<? extends Page>>();
		paginas.put("audio", AudioHome.class);
		paginas.put("autocompletar", AutocompleteHome.class);
		paginas.put("css", CssHome.class);
		paginas.put("encriptacion", EncriptacionHome.class);
		paginas.put("feedback", FeedbackHome.class);
		paginas.put("internacionalizacion", InternacionalizacionHome.class);
		paginas.put("jerarquia", JerarquiaHome.class);
		paginas.put("jquery", JQueryHome.class);
		paginas.put("listChoice", ListChoiceHome.class);
		paginas.put("modalWindow", ModalWindowHome.class);
		paginas.put("replaceContent", ReplaceContentHome.class);
		paginas.put("tablas", TablaHome.class);
		paginas.put("wicketLife", WicketLifeHome.class);
	}
	
	@Override
	public Class<? extends Page> getHomePage() {
		return Indice.class;
	}
	
	@Override
	protected void init() {
		super.init();
		
//		erroresCustomizados();
//		encriptarPaginas();
//		agregarCicloWicket();
		montarPaginas();
	}

	protected void montarPaginas() {
		for (String pagina : paginas.keySet()){
			this.mountPage(pagina, paginas.get(pagina));
		}
	}
	
	/**
	 * Método para que funcione la sesión personalizada
	 */
	@Override
	public Session newSession(Request request, Response response) {
		return new SesionPersonalizada(request);
	}
	
	protected void agregarCicloWicket() {
		this.getRequestCycleListeners().add(new CicloWicket());
	}
	
	protected void encriptarPaginas() {
		this.getSecuritySettings().setCryptFactory(new KeyInSessionSunJceCryptFactory());
		this.setRootRequestMapper(new CryptoMapper(getRootRequestMapper(), this));
	}

	protected void erroresCustomizados() {
		this.getApplicationSettings().setPageExpiredErrorPage(PageExpired.class);
		this.getApplicationSettings().setAccessDeniedPage(AccesoNegado.class);
		
		this.getApplicationSettings().setInternalErrorPage(InternalErrorPage.class);
		this.getExceptionSettings().setUnexpectedExceptionDisplay(IExceptionSettings.SHOW_INTERNAL_ERROR_PAGE);
	}
	
	//getters
	public static Map<String, Class<? extends Page>> getPaginas() {
		return paginas;
	}
}